﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Drawing.Printing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Collections;
using System.IO;
using System.Threading;


namespace GIFT
{
    public partial class InterfazPrincipal : Form
    {
        public InterfazPrincipal()
        {
            //Crea los hilos para presentar el splash screen
            Thread th = new Thread(new ThreadStart(DoSplash));
            th.Start();
            Thread.Sleep(0);
            th.Abort();
            Thread.Sleep(0);

            InitializeComponent();
            prtSettings = new PrinterSettings();
            pgSettings = new PageSettings();
            printDoc = new PrintDocument();
            printDoc.PrintPage += new PrintPageEventHandler(printDoc_PrintPage);
            controlInterfaz = new ControlInterfaz(this);
        }

        //Operacion que presenta el splash screen
        void DoSplash()
        {
            Splash sp = new Splash();
            sp.ShowDialog();
        }
        
        //Retorna el panel principal de la clase
        public Panel GetPanel()
        {
            return panelPrincipal;
        }

        //Retorna el treeView de la clase
        public TreeView GetTreeView()
        {
            return treeView;
        }

        //Retorna el control de la interfaz de la clase
        public ControlInterfaz GetControlInterfaz()
        {
            return controlInterfaz;
        }


        //Captura el evento del click en el boton salir del menu
        private void salirToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        //Captura el evento del click en el boton acerca de del menu
        private void acercaDeGIFTToolStripMenuItem_Click(object sender, EventArgs e)
        {
            AcercaDe frm = new AcercaDe();
            frm.Show();
        }

        //Captura el evento del click en el boton nuevo del menu
        private void nuevoToolStripMenuItem_Click(object sender, EventArgs e)
        {
            NuevoTipoCampo frm = new NuevoTipoCampo(this);
            frm.Show();
        }

        //Captura el evento del click en archivo nuevo formulario
        private void click_nuevoFormulario(object sender, EventArgs e)
        {
            CreaNuevo nfr = new CreaNuevo(this, "formulario");
            nfr.Show();
        }

        //Captura el evento del click en archivo nuevo comando
        private void click_NuevoComando(object sender, EventArgs e)
        {
            CreaNuevo nfr = new CreaNuevo(this, "comando");
            nfr.Show();
        }


        //Hace la carga al iniciar el form
        private void Form1_Load(object sender, EventArgs e)
        {
            controlInterfaz.LlenarTreeView(ClickDerechoArbolPrincipalNodoSecundario);
        }

        //Captura el evento de cerrar una pestana en la opcion del menu
        private void cerrarToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (activo != null)
            {
                activo.Close();
            }
        }

        //Captura el evento de guardar en la opcion del menu
        private void guardarToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (activo != null)
            {
                controlInterfaz.guardarArchivo(activo, tipoActivo);
            }
        }

        //Captura el evento de guardarComo en la opcion del menu
        private void guardarComoToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (activo != null)
            {
                GuardarComo guardar = new GuardarComo(this, tipoActivo, activo);
                guardar.Show();
            }
        }

        //Captura el evento de borrar en el menu
        private void borrarToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (activo != null)
            {
                DialogResult dr = MessageBox.Show("Está seguro que desea borrar el archivo?", "Borrar", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                switch (dr)
                {
                    case DialogResult.Yes: //en caso de que desee borrarlo
                        String nombreVentana = activo.Name;
                        String tipo = tipoActivo;
                        activo.Close();
                        controlInterfaz.borrado(nombreVentana, tipo);
                        habilitacionCampos();
                        controlInterfaz.quitarNodo(treeView, nombreVentana, tipo);
                        break;
                    case DialogResult.No: break;
                }
            }
        }

        //Captura el evento del click en el boton buscar del menu
        private void buscarToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Busqueda frm = new Busqueda(this);
            frm.Show();
        } 
        
        //Captura el evento del doble click en el treeview
        private void doubleClick_Tree(object sender, EventArgs e)
        {
            if (!estaAbierta(treeView.SelectedNode.Text))
            {
                String nodo = treeView.SelectedNode.Text;//saca el nombre del nodo apuntado
                if (nodo != "Tipo de Campo" && nodo != "Número" && nodo != "Binario" && 
                    nodo != "Incremental" && nodo != "FechaHora" && nodo != "Texto" &&
                    nodo != "Jerarquia" && nodo != "Lista" && nodo != "Formulario" &&
                    nodo != "Comando" && nodo != "Actividad" && nodo != "Flujo de Trabajo")//controla que no sea el padre
                {
                    abrirArchivo(treeView.SelectedNode.Text, treeView.SelectedNode.Parent.Name);
                }
            }
        }

        //Captura el evento del click en el boton cortar del menu
        private void cortarToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Control theControl = this.ActiveControl;
            if (theControl != null)
            {
                if (theControl is TextBox)
                {
                    TextBox theTextBoxControl = (TextBox)theControl;
                    if (theTextBoxControl.Text != "")
                    {
                        theTextBoxControl.SelectionStart = theTextBoxControl.SelectionStart;
                        theTextBoxControl.SelectionLength = theTextBoxControl.SelectedText.Length;
                        theTextBoxControl.Cut();
                    }
                }
            }
        }

        //Captura el evento del click en el boton pegar del menu
        private void pegarToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Control theControl = this.ActiveControl;
            if (theControl != null)
            {
                if (theControl is TextBox)
                {
                    TextBox theTextBoxControl = (TextBox)theControl;
                    theTextBoxControl.SelectionStart = theTextBoxControl.SelectionStart;
                    theTextBoxControl.SelectionLength = theTextBoxControl.SelectedText.Length;
                    theTextBoxControl.Paste();
                }
            }
        }

        //Captura el evento del click en el boton copiar del menu
        private void copiarToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Control theControl = this.ActiveControl;
            if (theControl != null)
            {
                if (theControl is TextBox)
                {
                    TextBox theTextBoxControl = (TextBox)theControl;
                    if (theTextBoxControl.Text != "")
                    {
                        theTextBoxControl.SelectionStart = theTextBoxControl.SelectionStart;
                        theTextBoxControl.SelectionLength = theTextBoxControl.SelectedText.Length;
                        theTextBoxControl.Copy();
                    }
                }
            }
        }

        //Captura el evento del click en el boton imprimir del menu
        private void imprimirToolStripMenuItem_Click(object sender, EventArgs e)
        {
            printDoc.DefaultPageSettings = pgSettings;
            PrintDialog dlg = new PrintDialog();
            dlg.Document = printDoc;
            if (dlg.ShowDialog() == DialogResult.OK)
            {
                printDoc.Print();
            }
        }

        //Captura el evento del click en el boton vista preliminar del menu
        private void printDoc_PrintPage(Object sender, PrintPageEventArgs e)
        {
            String textToPrint = Imprime();
            Font printFont = new Font("Times New Roman", 10); //CAMBIAR LETRA 
            int leftMargin = e.MarginBounds.Left;
            int topMargin = e.MarginBounds.Top;
            e.Graphics.DrawString(textToPrint, printFont, Brushes.Black, leftMargin, topMargin);
        }

        //Obtiene la informacion del tipo de campo que se va a imprimir
        private String Imprime()
        {
            if (activo != null && tipoActivo != "")
            {
                return controlInterfaz.ObtenerDatosImprimir(tipoActivo, activo);
            }
            return "error";
        }

        //Captura el evento del click en el boton vista preliminar del menu
        private void vistaPreliminarToolStripMenuItem_Click(object sender, EventArgs e)
        {
            PrintPreviewDialog dlg = new PrintPreviewDialog();
            dlg.Document = printDoc;
            dlg.ShowDialog();
        }

        //Captura el evento del click en el boton opciones de impresion del menu
        private void opcionesDeImpresiónToolStripMenuItem_Click(object sender, EventArgs e)
        {
            PageSetupDialog pageSetupDialog = new PageSetupDialog();
            pageSetupDialog.PageSettings = pgSettings;
            pageSetupDialog.PrinterSettings = prtSettings;
            pageSetupDialog.AllowOrientation = true;
            pageSetupDialog.AllowMargins = true;
            pageSetupDialog.ShowDialog();
        }

        //Captura el evento del click en el boton abrir del menu
        private void abrirToolStripMenuItem_Click(object sender, EventArgs e)
        {
            ventanaAbrir abrirArchivo; //crea un objeto ventanaAbrir
            abrirArchivo = new ventanaAbrir(this); //crea la ventana para abrir 
            abrirArchivo.Show();//se muestra
        }

        //Habilita los campos en el menu
        public void habilitarCampos()
        {
            this.cerrarToolStripMenuItem.Enabled = true;//habilita las opciones sobre las pestanas
            this.guardarToolStripMenuItem.Enabled = true;
            this.guardarComoToolStripMenuItem.Enabled = true;
            this.borrarToolStripMenuItem.Enabled = true;
            this.imprimirToolStripMenuItem.Enabled = true;
            this.opcionesDeImpresiónToolStripMenuItem.Enabled = true;
            this.vistaPreliminarToolStripMenuItem.Enabled = true;
            this.copiarToolStripMenuItem.Enabled = true;
            this.cortarToolStripMenuItem.Enabled = true;
            this.pegarToolStripMenuItem.Enabled = true;
        }

        //Deshabilita los campos en el menu
        private void deshabilitarCampos()
        {
            this.cerrarToolStripMenuItem.Enabled = false;//deshabilita las opciones sobre las pestanas
            this.guardarToolStripMenuItem.Enabled = false;
            this.guardarComoToolStripMenuItem.Enabled = false;
            this.borrarToolStripMenuItem.Enabled = false;
            this.imprimirToolStripMenuItem.Enabled = false;
            this.opcionesDeImpresiónToolStripMenuItem.Enabled = false;
            this.vistaPreliminarToolStripMenuItem.Enabled = false;
            this.copiarToolStripMenuItem.Enabled = false;
            this.cortarToolStripMenuItem.Enabled = false;
            this.pegarToolStripMenuItem.Enabled = false;
        }

        //Abre un tipo de campo para mostrar la informacion en la pantalla principal,recibe el nombre del campo, el tipo
        public void abrirArchivo(String nombre, String tipo)
        {
            Form nueva = controlInterfaz.abrirArchivo(nombre, tipo);
            nueva.TopLevel = false;
            panelPrincipal.Controls.Add(nueva);
            nueva.Show();
            if (panelPrincipal.Controls.Count == 1)//Si es la unica ventana que se abrio
            {
                habilitarCampos();//habilita los campos
            }
        }

        //Revisa si debe de deshabiliar los campos
        public void habilitacionCampos()
        {
            if (panelPrincipal.Controls.Count == 0)//Si es la ultima pestana abierta
            {
                deshabilitarCampos(); //deshabilita los campos
            }
        }

        //Captura el enter en el campo de busqueda
        private void CampoBuscarCheckKeys(object sender, System.Windows.Forms.KeyPressEventArgs e)
        {
            if (e.KeyChar == (char)13)
            {
                BuscarTexto();
            }
        }

        //Click en el campo buscar
        private void campoBuscar_Click(object sender, EventArgs e)
        {
            if (campoBuscar.Text == "Buscar") { campoBuscar.Text = ""; }
        }

        //Captura el evento del clik en el boton buscar
        private void botonBucar_Click(object sender, EventArgs e)
        {
            BuscarTexto();
        }

        //Busca el texto
        private void BuscarTexto()
        {
            if (campoBuscar.Text != "")
            {
                Busqueda frm = new Busqueda(this);
                frm.Show();
                frm.Buscar(campoBuscar.Text);
            }
            campoBuscar.Text = "Buscar";
        }

        //Recibe el nombre de el nodo, retorna true si ya esta abierta en la pantalla principal
        public bool estaAbierta(String tipoCampo)
        {
            for (int i = 0; i < panelPrincipal.Controls.Count; ++i)
            {
                if (panelPrincipal.Controls[i].Name == tipoCampo)
                {
                    return true;
                }
            }
            return false;
        }

        //Captura el click en nuevo cuando se le da click derecho en nodo principal
        private void abrirToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            if ( treeView.SelectedNode.Parent.Text == "Tipo de Campo")
            {
                NuevoTipoCampo frm = new NuevoTipoCampo(this, treeView.SelectedNode.Text);
                frm.Show();
            }
            else
            {
                CreaNuevo nuevo = new CreaNuevo(this, treeView.SelectedNode.Name);
                nuevo.Show();
            }
        }

        //Captura el evento de un click en un nodo
        private void click_treeView(object sender, TreeNodeMouseClickEventArgs e)
        {
            treeView.SelectedNode = e.Node;
        }


        //Captura evento click derecho nodo secundario en abrir
        private void AbrirDerechoSecundario_Click(object sender, EventArgs e)
        {
            abrirArchivo(treeView.SelectedNode.Text, treeView.SelectedNode.Parent.Name);
        }

        //Captura evento click derecho nodo secundario en eliminar
        private void EliminarDerechoSecundario_Click(object sender, EventArgs e)
        {
            //confirma el borrado
            DialogResult dr = MessageBox.Show("Esta seguro que desea borrar?", "Borrar", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
            switch (dr)
            {
                case DialogResult.Yes: //en caso de que desee borrar
                    controlInterfaz.borrado(treeView.SelectedNode.Text, treeView.SelectedNode.Parent.Name);
                    if (estaAbierta(treeView.SelectedNode.Text))//Si esta abierta debe de cerrar la pestana
                    {
                        Form ventana = new Form();
                        for (int i = 0; i < panelPrincipal.Controls.Count; ++i)
                        {
                            if (panelPrincipal.Controls[i].Name == treeView.SelectedNode.Text)
                            {
                                ventana = (Form)panelPrincipal.Controls[i];
                            }
                        }
                        ventana.Close();
                    }
                    controlInterfaz.quitarNodo(GetTreeView(), treeView.SelectedNode.Text, treeView.SelectedNode.Parent.Name);       
                    break;
                case DialogResult.No: break;
            }
        }

        //Cambia la ventana enfocada en el panel principal
        public void ventanaEnfocada(Form ventEnfocada, String tipo)
        {
            if (ventEnfocada != null)
            {
                activo = ventEnfocada;
                tipoActivo = tipo;
                habilitarCampos();
            }
            else
            {
                activo = null;
                tipoActivo = "";
                deshabilitarCampos();
            }
        }

        //Captura el evento de cerrar la ventana
        private void cerrandoVentana(object sender, FormClosingEventArgs e)
        {
            foreach (Control c in panelPrincipal.Controls)//Manda a cerrar todas las ventnas
            {
                ((Form)c).Close(); //Las convierte a forms pues son los unicos controles que posee
            }
        }



        
    }//Fin de la clase
}
